package com.smart.main;

import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Session;

/**
 *
 * @author zcastle
 */
public class Transaccion {

    private static Session session;

    public static Session getSession() {
        inciaOperacion();
        return session;
    }

    public static void closeSession(){
        terminaOperacion();
    }

    private static void inciaOperacion() {
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            System.err.println("Sesion Iniciada");
            session.beginTransaction();
            System.err.println("Transaccion Iniciada");
        } catch (HibernateException he) {
            System.err.println("No se puede abrir la Sesion" + he);
            he.printStackTrace();
        }
    }

    private static void terminaOperacion() {
        try {
            session.getTransaction().commit();
            System.err.println("Transaccion Terminada");
            session.close();
            System.err.println("Sesion Terminada");
        } catch (HibernateException he) {
            he.printStackTrace();
        }
    }

    private static void cancelarOperacion() {
        try {
            session.getTransaction().rollback();
            System.err.println("Transaccion Cancelada");
            session.close();
            System.err.println("Sesion Terminada");
        } catch (HibernateException ex) {
            throw new ExceptionInInitializerError(ex);
        }

    }

    public static List executeHQLQuery(String hql) {
        List resultList = null;
        try {
            inciaOperacion();
            resultList = session.createQuery(hql).list();
        } catch (HibernateException he) {
            cancelarOperacion();
            he.printStackTrace();
        } finally {
            terminaOperacion();
        }
        return resultList;
    }

    public static Integer executeHQLUpdate(String hql) {
        Integer resultCount = 0;
        try {
            inciaOperacion();
            resultCount = session.createQuery(hql).executeUpdate();
        } catch (HibernateException he) {
            cancelarOperacion();
            he.printStackTrace();
        } finally {
            terminaOperacion();
        }
        return resultCount;
    }
}
